package com.nit.tools.json;

import com.nit.tools.NitAssertTools;
import com.nit.tools.NitClassLoaderTools;
import com.nit.tools.json.impl.NitFastjsonConverter;
import com.nit.tools.json.impl.NitGsonConverter;
import com.nit.tools.json.impl.NitJacksonConverter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * JSON工具 NitJsonTools
 *
 * @Auth: 逆天开源-逍遥哥哥
 * @link: 1715656022@qq.com
 * @Date: 2023-07-26
 */
@Slf4j
public class NitJsonTools {

    private static final String JACKSON_CLASS = "com.fasterxml.jackson.databind.ObjectMapper";
    private static final String FAST_CLASS = "com.alibaba.fastjson.JSON";
    private static final String GSON_CLASS = "com.google.gson.Gson";

    private static final NitJsonConverter jsonConverter;

    static {
        jsonConverter = getCurrentJsonConverter();
    }

    /**
     * 对象转换为JSON字符串
     *
     * @param obj 对象
     * @return JSON字符串
     */
    public static String toJson(Object obj) {
        NitAssertTools.checkArgumentNull(obj, "对象为空");
        return jsonConverter.toJson(obj);
    }

    /**
     * 解析JSON字符串并转换为单个对象
     *
     * @param text        待解析的JSON字符串
     * @param targetClass 目标类
     * @param <T>         泛型
     * @return 对象
     */
    public static <T> T parseObject(String text, Class<T> targetClass) {
        NitAssertTools.checkArgumentNull(text, "待解析的JSON字符串为空");
        NitAssertTools.checkArgumentNull(targetClass, "目标类为空");
        return jsonConverter.parseObject(text, targetClass);
    }

    /**
     * 解析JSON字符串并转换为对象列表
     *
     * @param text        待解析的JSON字符串
     * @param targetClass 目标类
     * @param <T>         泛型
     * @return 对象列表
     */
    public static <T> List<T> parseObjectList(String text, Class<T> targetClass) {
        NitAssertTools.checkArgumentNull(text, "待解析的JSON字符串为空");
        NitAssertTools.checkArgumentNull(targetClass, "目标类为空");
        return jsonConverter.parseObjectList(text, targetClass);
    }

    /**
     * 解析JSON字符串并转换为Map列表
     *
     * @param text 待解析的JSON字符串
     * @return Map列表
     */
    public static List<Map<String, Object>> parseMapList(String text) {
        NitAssertTools.checkArgumentNull(StringUtils.isNotBlank(text), "待解析的JSON字符串为空");
        return jsonConverter.parseMapList(text);
    }


    /**
     * 获取JSON转换器实例
     *
     * @return JSON转换器实例
     */
    private static NitJsonConverter getCurrentJsonConverter() {
        if (NitClassLoaderTools.isClassLoaded(JACKSON_CLASS)) {
            log.debug("JSON工具将使用 jackson实现");
            return new NitJacksonConverter();
        }
        if (NitClassLoaderTools.isClassLoaded(FAST_CLASS)) {
            log.debug("JSON工具将使用 fastjson实现");
            return new NitFastjsonConverter();
        }
        if (NitClassLoaderTools.isClassLoaded(GSON_CLASS)) {
            log.debug("JSON工具将使用 gson实现");
            return new NitGsonConverter();
        }
        throw new RuntimeException("没有找到可用的JSON库");
    }


}
